package fiuba.algo3.gpschallenge.modelo;

import java.util.ArrayList;

//import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

import fiuba.algo3.gpschallenge.persistencia.SerializableAXml;



@XmlRootElement
public class Ranking implements SerializableAXml  {
	@XmlElementWrapper
	@XmlElement(name="puntaje")
	private List<Puntaje> listaDePuntajes;
	
	public Ranking (){
		listaDePuntajes = new ArrayList<Puntaje>();
	}
	public Iterable<Puntaje> getPuntajes() {
		return listaDePuntajes;
	}
	
	public int getCantidadDePuntajes(){
		return this.listaDePuntajes.size();
	}
	public void addPuntaje(Puntaje puntaje) {
		if (puntajeYaExiste(puntaje)){ 
			int i = 0;
			while (i < this.getCantidadDePuntajes()){
				if ( (listaDePuntajes.get(i).getNombreJugador().equals(puntaje.getNombreJugador()) && (listaDePuntajes.get(i).getPuntos() < puntaje.getPuntos()) ) ){
					listaDePuntajes.set(i, puntaje);
					break;
				}
				else i++;
			}
		}
		else this.listaDePuntajes.add (puntaje);
	}
	
	
	
	//Se fija si el nombre de un Puntaje esta en los del Ranking.
	public boolean puntajeYaExiste(Puntaje puntaje){
		boolean existe = false;
		if (this.listaDePuntajes.size() >= 1){
			for (int i = 0 ; i < this.listaDePuntajes.size() ; i++){
				if (this.listaDePuntajes.get(i).getNombreJugador().equals(puntaje.getNombreJugador())){
					existe = true;
				} 
			}
		} 
		return existe;
	}
	
	
	//Se fija si el nombre buscado existe en el Ranking
	public boolean nombreYaExisteEnElRanking(String nombreJugadorBuscado){
		boolean existe = false;
		if (this.listaDePuntajes.size() >= 1){
			for (int i = 0; i < this.listaDePuntajes.size(); i++){
				if (this.listaDePuntajes.get(i).getNombreJugador().equals(nombreJugadorBuscado)){
					existe = true;
				}
			}
		}
		return existe;
	}
	
	
	public void ordenar() {
		//ordena de menor a mayor
		Collections.sort(this.listaDePuntajes);
		//cambio el orden para que se mayot a menor
		Collections.reverse(this.listaDePuntajes);
	}
	
	
	/* Devuelve un array de Strings con los nombres de los jugadores que estan
	 * en el ranking.
	 */
	public String[] devolverNombresDeJugadoresEnRanking(){
		//devuelve ordenado.
		ordenar();
		String [] listaJugadores = new String[this.getCantidadDePuntajes()];
		for (int i = 0; i < this.getCantidadDePuntajes(); i++){
			listaJugadores[i] = this.listaDePuntajes.get(i).getNombreJugador();
		}
		
		return listaJugadores;
	}
}



